package main

import "sync"

const protocol = "tcp"      // 通讯协议
const nodeNumber = 100       // 系统中总结点数
const committeeNum = 10      // TODO 委员会数目【实验方便】
const nodeStartNum = "10000" // 节点的启动号
const delay = 200           // 延迟
const maxConn = 15          // 节点最大连接数

var currentTransNum = make(map[string]uint64) // 每个节点记录的系统交易数
var currentTransNumLock sync.Mutex

var currentAllTransNum = make(map[string]uint64) // 每个节点记录的系统总的交易数
//var currentAllTransNumLock sync.Mutex  // 使用currentTransNumLock锁替代

const maxTransNumPerRound = 1500 // TODO 每轮最大处理交易数目
var genesisTimeStamp uint64      // 创世区块时间戳

var fromPerson string // 防止多次打开钱包
var toPerson string

var currentNodeChainObj = make(map[string]*BlockChain) // nodeID 与 区块链对象 映射
var currentNodeChainObjLock sync.Mutex

//////////////////////////////////////////
// 数据库设置
//////////////////////////////////////////
const blockChainDB = "blockChain.db" // 区块链数据库
const blockBucket = "bucket_"        // "bucket_端口号"

//////////////////////////////////////////
// 内存池设置
//////////////////////////////////////////
// 微块内存池: 存放各节点收到的微块数目(如果满足条件，节点打包生成完整区块)
var nodeAcceptMiniNum = make(map[string][]*MiniBlock) // key: "8000"  value: 微块
var nodeAcceptMiniNumLock sync.Mutex                  // 加锁处理(防止多协程同时处理map)

// 交易内存池:(存放每个节点收到的交易)
var transMemPool = make(map[string][]*NorTransaction) // key: "8000"  value: 正常交易列表
var transMemPoolLock sync.Mutex                       // 加锁处理(防止多协程同时处理map)

//////////////////////////////////////////
// 委员会设置
//////////////////////////////////////////

// map[1:[8000 8001] 2:[8002 8003] 3:[8004 8005] 4:[8006 8007] 5:[8008 8009]]
// key:委员会编号  value:同一委员会成员  value[0]:委员会中leader
var committeeMemberInfo = make(map[int][]string)
// var committeeMemberInfoLock sync.Mutex

// 标识
// a ——> 普通交易
// b ——> 分发交易
// c ——> 转让交易
// m ——> 微块
// f ——> 完整区块

const lastBlockHash = "LastBlockHash" // 区块链中最后一个区块hash的索引

//////////////////////////////////////////
// 实验部分
//////////////////////////////////////////

var MiNiToFullOnlyNew string = "./experiment_2/epoch_6/miniToFullOnly_node100_txs1500.txt" // 微块重组时间(仅重组过程，模拟节点处理速度)
// var MiNiToFullOnlyNew string = "./experiment/epoch_imp/miniToFullOnly_txs_1000_full.txt" // 微块重组时间(仅重组过程，模拟节点处理速度)
var transSpendFile string = "./experiment_2/epoch_6/txSpeed_delay_node100_txs1500.txt" // 交易处理速度文件
var transSpendFileNoDelay string = "./experiment_2/epoch_6/txSpeed_nodelay_node100_txs1500.txt"  // 交易处理速度文件(不包含网络延迟)

//var consensusTime string = "./experiment/epoch_2/consensus_time.txt"          // 内部共识时间
//var msgBroadcastTime string = "./experiment/epoch_2/msg_broadcast_time_8.txt" // 消息传播时间